Riqueza de especies

NOTA: Para evitar errores en las operaciones con proyecciones, antes de ejecutar el programa, en la línea de comandos se ejecutó:

export PROJ_LIB=/home/mfvargas/miniconda3/envs/biodatacr-r/share/proj

Especies en la lista roja de la UICN

0. Carga de registros de presencia

Code
# Carga de registros de presencia
registros_presencia_lista_roja <-
  st_read(
    "registros-presencia-lista-roja.csv",
    
    options = c(
      "X_POSSIBLE_NAMES=decimalLongitude", # columna de longitud decimal
      "Y_POSSIBLE_NAMES=decimalLatitude"   # columna de latitud decimal
    ),
    quiet = TRUE
  )

# Asignación del CRS WGS84
st_crs(registros_presencia_lista_roja) <- 4326

1. Unión espacial de registros de presencia y hexágonos

Code
# Unión espacial de registros de presencia y hexágonos (solo la columna cod_canton),
# mediante el predicado st_within().
# Como resultado, cod_canton se une al conjunto de datos de félidos.
registros_presencia_union_hexagonos <- 
  st_join(
    x = registros_presencia_lista_roja,
    y = dplyr::select(cr_hex_grid_res_5, h3_address), # selección de columna cod_canton
    join = st_within
  )

# Despliegue de los datos unidos
registros_presencia_union_hexagonos |>
  st_drop_geometry() |>
  dplyr::select(species, locality, h3_address) |>
  datatable(
    colnames = c("Especie", "Localidad", "Código de hexágono"),
    options = list(
      pageLength = 5,
      language = list(url = '//cdn.datatables.net/plug-ins/1.10.11/i18n/Spanish.json')
    )
  )

2. Conteo de la cantidad de especies de félidos en cada cantón

Code
# Conteo de la cantidad de especies
riqueza_especies_registros_presencia_lista_roja_hexagonos <-
  registros_presencia_union_hexagonos |>
  st_drop_geometry() |>
  group_by(h3_address) |>
  summarize(riqueza_especies = n_distinct(species, na.rm = TRUE))

# Despliegue de la cantidad de especies en cada hexágono
riqueza_especies_registros_presencia_lista_roja_hexagonos |>
  arrange(desc(riqueza_especies)) |>
  datatable(
    colnames = c("Código de hexágono", "Riqueza de especies"),
    options = list(
      pageLength = 5,
      language = list(url = '//cdn.datatables.net/plug-ins/1.10.11/i18n/Spanish.json')
    )
  )

3. Unión no espacial de hexágonos con el dataframe de riqueza de especies en hexágonos

Code
# Unión (no espacial) de hexágonos y riqueza de especies
hexagonos_union_riqueza <-
  left_join(
    x = cr_hex_grid_res_5,
    y = dplyr::select(
        riqueza_especies_registros_presencia_lista_roja_hexagonos, 
        h3_address, 
    riqueza_especies),
    by = "h3_address"
  ) |>
  replace_na(list(riqueza_especies = 0))

# Despliegue de los datos de riqueza de especies en hexágonos
hexagonos_union_riqueza |>
  st_drop_geometry() |>
  dplyr::select(h3_address, riqueza_especies) |>
  arrange(desc(riqueza_especies)) |>
  datatable(
    colnames = c("Hexágono", "Riqueza de especies"),
    options = list(
      pageLength = 5,
      language = list(url = '//cdn.datatables.net/plug-ins/1.10.11/i18n/Spanish.json')
    )
  )

4. Mapa de riqueza de especies

Code
# Paleta de colores de riqueza de especies
colores_riqueza_especies <-
  colorNumeric(
    palette = "Reds",
    domain = hexagonos_union_riqueza$riqueza_especies,
    na.color = "transparent"
  )

# Paleta de colores de especies
colores_especies <- colorFactor(
  palette = viridis(length(unique(registros_presencia_lista_roja$species))), 
  domain = registros_presencia_lista_roja$species
)

# Mapa leaflet
leaflet() |>
  setView(
    lng = -84.19452,
    lat = 9.572735,
    zoom = 7) |>
  addTiles(group = "Mapa general (OpenStreetMap)") |>
  addProviderTiles(
    providers$Esri.WorldImagery, 
    group = "Imágenes satelitales (ESRI World Imagery)"
  ) |> 
  addPolygons(
    data = hexagonos_union_riqueza,
    fillColor = ~ colores_riqueza_especies(hexagonos_union_riqueza$riqueza_especies),
    fillOpacity = 0.8,
    color = "black",
    stroke = TRUE,
    weight = 1.0,
    popup = paste(
      paste("<strong>Hexágono:</strong>", hexagonos_union_riqueza$h3_address),
      paste("<strong>Riqueza de especies:</strong>", hexagonos_union_riqueza$riqueza_especies),
      sep = '<br/>'
    ),
    group = "Riqueza de especies"
  ) |>
  addScaleBar(
    position = "bottomleft", 
    options = scaleBarOptions(imperial = FALSE)
  ) |>    
  addLegend(
    position = "bottomleft",
    pal = colores_riqueza_especies,
    values = hexagonos_union_riqueza$riqueza_especies,
    group = "Riqueza de especies",
    title = "Riqueza de especies"
  ) |>
  addCircleMarkers(
    data = registros_presencia_lista_roja,
    stroke = F,
    radius = 4,
    fillColor = ~colores_especies(registros_presencia_lista_roja$species),
    fillOpacity = 1.0,
    popup = paste(
      paste0("<strong>Especie: </strong>", registros_presencia_lista_roja$species),
      paste0("<strong>Localidad: </strong>", registros_presencia_lista_roja$locality),
      paste0("<strong>Fecha: </strong>", registros_presencia_lista_roja$eventDate),
      paste0("<strong>Fuente: </strong>", registros_presencia_lista_roja$institutionCode),
      paste0("<a href='", registros_presencia_lista_roja$occurrenceID, "'>Más información</a>"),
      sep = '<br/>'
    ),    
    group = "Registros de presencia"
  ) |>  
  addLayersControl(
    baseGroups = c(
      "Mapa general (OpenStreetMap)", 
      "Imágenes satelitales (ESRI World Imagery)"
    ),
    overlayGroups = c(
      "Riqueza de especies",
      "Registros de presencia"
    )
  ) |>
  addResetMapButton() |>
  addSearchOSM() |>
  addMouseCoordinates() |>
  addFullscreenControl() |>
  hideGroup("Registros de presencia")